package com.lhkj.ct.base.mybatis.extension.service;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lhkj.ct.base.model.dto.PageQuery;
import com.lhkj.ct.base.mybatis.core.metadata.SqlOrder;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * <p>
 *     分页接口
 * </p>
 */
public interface IPageService<T> {

    default Page<T> generatePage(PageQuery pageQuery){
        pageQuery.calculatePageAndLimit();
        if (StringUtils.isNotBlank(pageQuery.getOrderByColumn())){
            return generatePage(pageQuery.getPage(), pageQuery.getLimit(), new OrderItem(StrUtil.toUnderlineCase(pageQuery.getOrderByColumn()), pageQuery.isAsc()));
        }
        return generatePage(pageQuery.getPage(), pageQuery.getLimit(), new ArrayList<>());
    }

    default Page<T> generatePageDesc(PageQuery pageQuery, SFunction<T, ?>... descColumn){
        pageQuery.calculatePageAndLimit();
        if (StringUtils.isNotBlank(pageQuery.getOrderByColumn())){
            return generatePage(pageQuery.getPage(), pageQuery.getLimit(), new OrderItem(StrUtil.toUnderlineCase(pageQuery.getOrderByColumn()), pageQuery.isAsc()));
        }
        return generatePage(pageQuery.getPage(), pageQuery.getLimit(), SqlOrder.descs(descColumn));
    }

    default Page<T> generatePageAsc(PageQuery pageQuery, SFunction<T, ?>... ascColumn){
        pageQuery.calculatePageAndLimit();
        if (StringUtils.isNotBlank(pageQuery.getOrderByColumn())){
            return generatePage(pageQuery.getPage(), pageQuery.getLimit(), new OrderItem(StrUtil.toUnderlineCase(pageQuery.getOrderByColumn()), pageQuery.isAsc()));
        }
        return generatePage(pageQuery.getPage(), pageQuery.getLimit(), SqlOrder.ascs(ascColumn));
    }

    default Page<T> generatePage(PageQuery pageQuery, OrderItem... orders){
        pageQuery.calculatePageAndLimit();
        if (StringUtils.isNotBlank(pageQuery.getOrderByColumn())){
            return generatePage(pageQuery.getPage(), pageQuery.getLimit(), new OrderItem(StrUtil.toUnderlineCase(pageQuery.getOrderByColumn()), pageQuery.isAsc()));
        }
        return generatePage(pageQuery.getPage(), pageQuery.getLimit(), orders);
    }

//    default Page<T> generatePage(int page, int limit){
//        return new Page<>(page, limit);
//    }

    default Page<T> generatePage(int page, int limit, OrderItem... orders){
        return generatePage(page, limit, Arrays.asList(orders));
    }

    default Page<T> generatePage(int page, int limit, List<OrderItem> orders){
        Page<T> orderPage = new Page<>(page, limit);
        if (null != orders) orderPage.setOrders(orders);
        return orderPage;
    }

}
